package com.seari.custody.service.Impl;

import cn.hutool.core.io.FileUtil;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.deepoove.poi.data.TableRenderData;
import com.deepoove.poi.data.Tables;
import com.deepoove.poi.data.style.TableStyle;
import com.seari.custody.bean.SpecialProtection;
import com.seari.custody.bean.SpecialWord;
import com.seari.custody.bean.TechnicalAdvice;
import com.seari.custody.bean.TechnicalHistory;
import com.seari.custody.component.MinIoUtil;
import com.seari.custody.constant.BusinessConstant;
import com.seari.custody.mapper.ReportProjectMapper;
import com.seari.custody.mapper.SpecialProtectionMapper;
import com.seari.custody.mapper.TechnicalAdviceMapper;
import com.seari.custody.mapper.TechnicalAuditOpinionMapper;
import com.seari.custody.service.SpecialProtectionService;
import com.seari.custody.util.Common;
import com.seari.custody.util.HttpClientUtil;
import com.seari.custody.util.UUIDUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.*;

@Service("SpecialProtectionService")
@Transactional(rollbackFor = Exception.class)
public class SpecialProtectionServiceImpl implements SpecialProtectionService {

    @Value("${minio.word}")
    private String minioword;
    @Value("${minio.pdf}")
    private String miniopdf;
    @Value("${minio.fileAddress}")
    private String fileAddress;
    @Value("${minio.projectpdf.bucket}")
    private String projectpdf;
    @Value("${minio.projectword.bucket}")
    private String projectword;
    @Autowired
    private SpecialProtectionMapper specialProtectionMapper;

    @Autowired
    private TechnicalAdviceMapper technicalAdviceMapper;

    @Autowired
    private TechnicalAdviceServiceImpl technicalAdviceServiceImpl;

    @Autowired
    private TechnicalAuditOpinionMapper technicalAuditOpinionMapper;

    @Autowired
    private MinIoUtil minIoUtil;

    @Autowired
    private ReportProjectMapper reportProjectMapper;

    /**
     * 判断技审文件上传专项保护方案校验是否成功
     * @param map
     * @return
     * @throws Exception
     */
    @Override
    public String SpecialProtectionType(Map<String, String> map) throws Exception {
        Common common = new Common();
        Map<String, Object> params = new HashMap<>();
        //生成随机的id
        String fileI = UUIDUtils.getUUID();
        //技审意见模板类型
        String type = map.get("type");
        //获取项目uuid的值
        String uuid = map.get("uuid");
        //获取项目
        String TechnicalID = map.get("tnical");
        //获取上传文件的文件名
        String name=map.get("name");
        //根据uuid查询word信息
        TechnicalAdvice technicalAdvice = technicalAdviceMapper.selectTechnicalAdviceByUuid(TechnicalID);
        //获取的word文档的文件名
        String fileName = technicalAdvice.getFileName();
        String url = "http://172.20.41.71:9000/projectword/" + fileName;
        String pdfurl = null;
        String Guarpmonit = "1";
        //建设单位
        params.put("constructionUnit", technicalAdvice.getConstructionUnit());
        //项目名称
        params.put("projectName", technicalAdvice.getProjectName());
        //获取当前的日期
        Date date = new Date();
        SpecialProtection specialProtection = new SpecialProtection();
        specialProtection.setNo(TechnicalID);
        specialProtection.setFileUuid(uuid);
        specialProtection.setCreateTime(date);
        List<String> listeded;
        List<Map<String, Object>> shizheng;
        //初始化返回的文档类型
        String  realPath="";
        //初始化File
        File realfile=null;
        //初始化返回的生成专项保护方案校验
        Integer initial_size=0;
        RowRenderData row5;
        RowRenderData row6;
        RowRenderData row7;
        RowRenderData row8;
        TableStyle.BorderStyle borderStyle;
        Tables.TableBuilder tableBuilder;
        TableRenderData tableRenderData;
        //编号
        Integer tag=0;
        //文字内容
        String tagWriting="";
        //返回车站、区间数据
        Map<String, String> railroadSection=technicalAdviceMapper.serverQueryLine(map);
        //车站
        String station=railroadSection.get("station_flag");
        //区间
        String section=railroadSection.get("station_area");
        Integer num=0;
        RowRenderData row1;
        RowRenderData row2;
        List Mnterval=new ArrayList();
        RowRenderData row0 = Rows.of("序号", "项目类型或涉及地铁结构类型", "风险点", "具体措施").textFontSize(14).center().create();
        Mnterval.add(row0);
        //是否为车站:地上、地下
        if(station!="0"){
             row1 = Rows.of(String.valueOf(num+1), "车站出入口及风井", "烟、尘过大；\n" +
                    "防汛、防台、防倒灌\n" +
                    "防火", "洒水、防尘网\n" +
                    "准备应急预案和物资\n" +
                    "严禁材料堆放在出入口侧").textFontSize(14).create();
             row2 = Rows.of(String.valueOf(num+2), "车站出入口", "防坠物", "设置防护架确保乘客通行安全").textFontSize(14).create();
            Mnterval.add(row1);
            Mnterval.add(row2);
             num=num+2;
        }
        RowRenderData row3;
        //单圆、双圆、矩形
        if(section.contains("1")||section.contains("2")||section.contains("3")){
             row3 = Rows.of(String.valueOf(num+1), "区间隧道或地下车站", "重车行走路线", "铺钢板、打桩做栈桥").textFontSize(14).create();
            Mnterval.add(row3);
             num=num+1;
        }
        RowRenderData row4;
        //高架、地面
        if(section.contains("4")||section.contains("5")){
             row4 = Rows.of(String.valueOf(num+1), "高架线路", "设备侵限\n" +
                    "防火", "限制机械运行范围\n" +
                    "严禁材料堆放在高架下方").textFontSize(14).create();
            Mnterval.add(row4);
            num=num+1;
        }

        switch (type){
            //基坑类
            case "1" :
                 initial_size=Common.initialoint(projectword,fileName, BusinessConstant.JK_TYPE_DSJ_START, BusinessConstant.JK_TYPE_DSJ_END);
                if(initial_size==0){
                    technicalAdviceMapper.technicaldelect(TechnicalID);
                    return "上传基坑技审模板不一致，请重新上传";
                }
                 shizheng = common.throughDataStr(projectword,fileName, BusinessConstant.JK_TYPE_DSJ_START, BusinessConstant.JK_TYPE_DSJ_END, "2");
                params.put("directory", shizheng);

                row5 = Rows.of(String.valueOf(num+1), "基坑工程", "围护变形过大", "增加临时支撑、加快结构回筑").textFontSize(14).create();
                row6 = Rows.of(String.valueOf(num+2), "基坑项目", "坑外水位降低过大", "回灌").textFontSize(14).create();
                row7 = Rows.of(String.valueOf(num+3), "桩基工程", "坍孔", "钻孔桩增加钢护筒、地墙槽壁加固").textFontSize(14).create();
                row8 = Rows.of(String.valueOf(num+4), "其他", "", "").textFontSize(14).create();
                Mnterval.add(row5);
                Mnterval.add(row6);
                Mnterval.add(row7);
                Mnterval.add(row8);
                borderStyle = new TableStyle.BorderStyle();
                borderStyle.setColor("A6A6A6");
                borderStyle.setSize(16);
                borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
                tableBuilder = Tables.ofA4MediumWidth();
                for(int i=0;i<Mnterval.size();i++){
                    tableBuilder.addRow((RowRenderData) Mnterval.get(i));
                }
                tableRenderData=tableBuilder.border(borderStyle).center().create();
                params.put("table1", tableRenderData);
                //编号
                tag=0;
                //文字内容
                tagWriting="";
                //是否为车站:地上、地下
                if(station!="0"){
                    tagWriting="\n"+(tag+1)+"、车站结构或车站附属设施出现病害或对运营产生影响\n"
                            +"\t我方将制定车站结构或车站附属设施出现病害或对运营产生影响相关应急预案，一旦发生此类情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门要，安排施工队伍对病害进行整治，根据事件原因进行项目的技术调整,如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。"
                            +"\n"+(tag+2)+"、施工导致烟雾、扬尘进入车站对运营产生影响\n"
                            +"\t我方将制定施工导致烟雾、扬尘进入车站对运营产生影响相关应急预案，一旦发生上述情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员进行问题排查，根据事件原因进行项目的技术调整，如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。";
                    tag=tag+2;
                }
                //单圆、双圆、矩形
                if(section.contains("1")||section.contains("2")||section.contains("3")){
                    tagWriting=tagWriting+"\n"+(tag+1)+"、隧道出现严重病害\n"
                            +"\t我方将制定隧道出现严重病害相关应急预案，一旦发生此类情况现场将立即停工。地铁隧道内发生严重漏泥、漏砂、漏水、掉块、开裂等病害时，我方立即将相关信息及工程对应情况报告地铁监护管理部门。根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。";
                    tag=tag+1;
                }
                //高架、地面
                if(section.contains("4")||section.contains("5")){
                    tagWriting=tagWriting+"\n"+(tag+1)+"、项目原因导致高架区段异物侵限\n"
                            +"\t我方将制定高架区段异物侵限相关应急预案，一旦发生此类情况现场将立即停工。发生塔吊、吊车侵限，施工异物掉入高架区间或车站时，现场立即停工，第一时间向地铁监护部门汇报，制定相关方案，如对地铁结构造成影响，根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。";
                    tag=tag+1;
                }
                tagWriting=tagWriting+"\n"+(tag+1)+"、恶劣天气影响\n"
                        +"\t我方将制定因恶劣天气导致车站运营产生影响的相关应急预案，事件发生前做好防范工作，现场准备相关应急物资。如对车站运营造成影响，结合现场情况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员处理问题，并负责后续的修复工作直至满足正常运营要求。";
                params.put("yingjiyuan",tagWriting);

//                realPath = System.getProperty("user.dir") + "\\src\\main\\resources\\patternplate\\专项保护方案\\基坑类\\专项保护方案-基坑类（基坑工程-单圆、双圆、矩形、地上下、高架）.docx";
                realfile = com.seari.custody.util.FileUtil.copyResourceFileToTemp("patternplate\\专项保护方案\\基坑类\\专项保护方案-基坑类（基坑工程-单圆、双圆、矩形、地上下、高架）.docx");
                listeded = Common.downloadWorde(realfile, params, "基坑");
                break;
                //拆除类
            case "2" :
                 initial_size=Common.initialoint(projectword,fileName, BusinessConstant.CC_TYPE_DSJ_START, BusinessConstant.CC_TYPE_DSJ_END);
                if(initial_size==0){
                    technicalAdviceMapper.technicaldelect(TechnicalID);
                    return "上传拆除技审模板不一致，请重新上传";
                }
                 shizheng = common.throughDataStr(projectword,fileName, BusinessConstant.CC_TYPE_DSJ_START, BusinessConstant.CC_TYPE_DSJ_END, "2");
                params.put("directory", shizheng);

                row7 = Rows.of(String.valueOf(num+1), "其他", "", "").textFontSize(14).create();
                Mnterval.add(row7);
                borderStyle = new TableStyle.BorderStyle();
                borderStyle.setColor("A6A6A6");
                borderStyle.setSize(16);
                borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
                tableBuilder = Tables.ofA4MediumWidth();
                for(int i=0;i<Mnterval.size();i++){
                    tableBuilder.addRow((RowRenderData) Mnterval.get(i));
                }
                tableRenderData=tableBuilder.border(borderStyle).center().create();
                params.put("table1", tableRenderData);
                //编号
                tag=0;
                //文字内容
                tagWriting="";
                //是否为车站:地上、地下
                if(station!="0"){
                    tagWriting="\n"+(tag+1)+"、车站结构或车站附属设施出现病害或对运营产生影响\n"
                            +"\t我方将制定车站结构或车站附属设施出现病害或对运营产生影响相关应急预案，一旦发生此类情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门要，安排施工队伍对病害进行整治，根据事件原因进行项目的技术调整,如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。"
                            +"\n"+(tag+2)+"、施工导致烟雾、扬尘进入车站对运营产生影响\n"
                            +"\t我方将制定施工导致烟雾、扬尘进入车站对运营产生影响相关应急预案，一旦发生上述情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员进行问题排查，根据事件原因进行项目的技术调整，如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。";
                    tag=tag+2;
                }
                //单圆、双圆、矩形
                if(section.contains("1")||section.contains("2")||section.contains("3")){
                    tagWriting=tagWriting+"\n"+(tag+1)+"、隧道出现严重病害\n"
                            +"\t我方将制定隧道出现严重病害相关应急预案，一旦发生此类情况现场将立即停工。地铁隧道内发生严重漏泥、漏砂、漏水、掉块、开裂等病害时，我方立即将相关信息及工程对应情况报告地铁监护管理部门。根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。";
                    tag=tag+1;
                }
                //高架、地面
                if(section.contains("4")||section.contains("5")){
                    tagWriting=tagWriting+"\n"+(tag+1)+"、项目原因导致高架区段异物侵限\n"
                            +"\t我方将制定高架区段异物侵限相关应急预案，一旦发生此类情况现场将立即停工。发生塔吊、吊车侵限，施工异物掉入高架区间或车站时，现场立即停工，第一时间向地铁监护部门汇报，制定相关方案，如对地铁结构造成影响，根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。";
                    tag=tag+1;
                }
                tagWriting=tagWriting+"\n"+(tag+1)+"、恶劣天气影响\n"
                        +"\t我方将制定因恶劣天气导致车站运营产生影响的相关应急预案，事件发生前做好防范工作，现场准备相关应急物资。如对车站运营造成影响，结合现场情况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员处理问题，并负责后续的修复工作直至满足正常运营要求。";
                params.put("yingjiyuan",tagWriting);
//                realPath = System.getProperty("user.dir") + "\\src\\main\\resources\\patternplate\\专项保护方案\\拆除类\\专项保护方案-拆除类（拆除工程-单圆、双圆、矩形、地上下、高架）.docx";
                realfile = com.seari.custody.util.FileUtil.copyResourceFileToTemp("patternplate\\专项保护方案\\拆除类\\专项保护方案-拆除类（拆除工程-单圆、双圆、矩形、地上下、高架）.docx");
                listeded = Common.downloadWorde(realfile, params, "拆除");
                break;
                //勘探类
            case "3" :
                 initial_size=Common.initialoint(projectword,fileName, BusinessConstant.KT_TYPE_DSJ_START, BusinessConstant.KT_TYPE_DSJ_END);
                if(initial_size==0){
                    technicalAdviceMapper.technicaldelect(TechnicalID);
                    return "上传勘探技审模板不一致，请重新上传";
                }
                shizheng = common.throughDataStr(projectword,fileName, BusinessConstant.KT_TYPE_DSJ_START, BusinessConstant.KT_TYPE_DSJ_END, "2");
                params.put("directory", shizheng);
                row7 = Rows.of(String.valueOf(num+1), "其他", "", "").textFontSize(14).create();
                Mnterval.add(row7);
                borderStyle = new TableStyle.BorderStyle();
                borderStyle.setColor("A6A6A6");
                borderStyle.setSize(16);
                borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
                tableBuilder = Tables.ofA4MediumWidth();
                for(int i=0;i<Mnterval.size();i++){
                    tableBuilder.addRow((RowRenderData) Mnterval.get(i));
                }
                tableRenderData=tableBuilder.border(borderStyle).center().create();
                params.put("table1", tableRenderData);
                //编号
                tag=0;
                //文字内容
                tagWriting="";
                //是否为车站:地上、地下
                if(station!="0"){
                    tagWriting="\n"+(tag+1)+"、车站结构或车站附属设施出现病害或对运营产生影响\n"
                            +"\t我方将制定车站结构或车站附属设施出现病害或对运营产生影响相关应急预案，一旦发生此类情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门要，安排施工队伍对病害进行整治，根据事件原因进行项目的技术调整,如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。"
                            +"\n"+(tag+2)+"、施工导致烟雾、扬尘进入车站对运营产生影响\n"
                            +"\t我方将制定施工导致烟雾、扬尘进入车站对运营产生影响相关应急预案，一旦发生上述情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员进行问题排查，根据事件原因进行项目的技术调整，如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。";
                    tag=tag+2;
                }
                //单圆、双圆、矩形
                if(section.contains("1")||section.contains("2")||section.contains("3")){
                    tagWriting=tagWriting+"\n"+(tag+1)+"、隧道出现严重病害\n"
                            +"\t我方将制定隧道出现严重病害相关应急预案，一旦发生此类情况现场将立即停工。地铁隧道内发生严重漏泥、漏砂、漏水、掉块、开裂等病害时，我方立即将相关信息及工程对应情况报告地铁监护管理部门。根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。";
                    tag=tag+1;
                }
                //高架、地面
                if(section.contains("4")||section.contains("5")){
                    tagWriting=tagWriting+"\n"+(tag+1)+"、项目原因导致高架区段异物侵限\n"
                            +"\t我方将制定高架区段异物侵限相关应急预案，一旦发生此类情况现场将立即停工。发生塔吊、吊车侵限，施工异物掉入高架区间或车站时，现场立即停工，第一时间向地铁监护部门汇报，制定相关方案，如对地铁结构造成影响，根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。";
                    tag=tag+1;
                }
                tagWriting=tagWriting+"\n"+(tag+1)+"、恶劣天气影响\n"
                        +"\t我方将制定因恶劣天气导致车站运营产生影响的相关应急预案，事件发生前做好防范工作，现场准备相关应急物资。如对车站运营造成影响，结合现场情况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员处理问题，并负责后续的修复工作直至满足正常运营要求。";
                params.put("yingjiyuan",tagWriting);
//                realPath = System.getProperty("user.dir") + "\\src\\main\\resources\\patternplate\\专项保护方案\\勘探类\\专项保护方案-勘察类（勘探工程-单圆、双圆、矩形、地上下、高架）.docx";
                realfile = com.seari.custody.util.FileUtil.copyResourceFileToTemp("patternplate\\专项保护方案\\勘探类\\专项保护方案-勘察类（勘探工程-单圆、双圆、矩形、地上下、高架）.docx");
                listeded = Common.downloadWorde(realfile, params, "勘探");
                break;
            //绿化类
            case "4" :
                 initial_size=Common.initialoint(projectword,fileName, BusinessConstant.LH_TYPE_DSJ_START, BusinessConstant.LH_TYPE_DSJ_END);
                if(initial_size==0){
                    technicalAdviceMapper.technicaldelect(TechnicalID);
                    return "上传绿化技审模板不一致，请重新上传";
                }
                shizheng = common.throughDataStr(projectword,fileName, BusinessConstant.LH_TYPE_DSJ_START, BusinessConstant.LH_TYPE_DSJ_END, "2");
                params.put("directory", shizheng);


                row7 = Rows.of(String.valueOf(num+1), "其他", "", "").textFontSize(14).create();
                Mnterval.add(row7);
                borderStyle = new TableStyle.BorderStyle();
                borderStyle.setColor("A6A6A6");
                borderStyle.setSize(16);
                borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
                tableBuilder = Tables.ofA4MediumWidth();
                for(int i=0;i<Mnterval.size();i++){
                    tableBuilder.addRow((RowRenderData) Mnterval.get(i));
                }
                tableRenderData=tableBuilder.border(borderStyle).center().create();

                params.put("table1", tableRenderData);
                //编号
                tag=0;
                //文字内容
                tagWriting="";
                //是否为车站:地上、地下
                if(station!="0"){
                    tagWriting=tagWriting+(tag+1)+"、车站结构或车站附属设施出现病害或对运营产生影响\n"
                            +"\t我方将制定车站结构或车站附属设施出现病害或对运营产生影响相关应急预案，一旦发生此类情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门要，安排施工队伍对病害进行整治，根据事件原因进行项目的技术调整,如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。\n"
                            +(tag+2)+"、施工导致烟雾、扬尘进入车站对运营产生影响\n"
                            +"\t我方将制定施工导致烟雾、扬尘进入车站对运营产生影响相关应急预案，一旦发生上述情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员进行问题排查，根据事件原因进行项目的技术调整，如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。\n";
                    tag=tag+2;
                }
                //单圆、双圆、矩形
                if(section.contains("1")||section.contains("2")||section.contains("3")){
                    tagWriting=tagWriting+(tag+1)+"、隧道出现严重病害\n"
                            +"\t我方将制定隧道出现严重病害相关应急预案，一旦发生此类情况现场将立即停工。地铁隧道内发生严重漏泥、漏砂、漏水、掉块、开裂等病害时，我方立即将相关信息及工程对应情况报告地铁监护管理部门。根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。\n";
                    tag=tag+1;
                }
                //高架、地面
                if(section.contains("4")||section.contains("5")){
                    tagWriting=tagWriting+(tag+1)+"、项目原因导致高架区段异物侵限\n"
                            +"\t我方将制定高架区段异物侵限相关应急预案，一旦发生此类情况现场将立即停工。发生塔吊、吊车侵限，施工异物掉入高架区间或车站时，现场立即停工，第一时间向地铁监护部门汇报，制定相关方案，如对地铁结构造成影响，根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。\n";
                    tag=tag+1;
                }
                tagWriting=tagWriting+(tag+1)+"、恶劣天气影响\n"
                        +"\t我方将制定因恶劣天气导致车站运营产生影响的相关应急预案，事件发生前做好防范工作，现场准备相关应急物资。如对车站运营造成影响，结合现场情况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员处理问题，并负责后续的修复工作直至满足正常运营要求。\n";
                params.put("yingjiyuan",tagWriting);
//                realPath = System.getProperty("user.dir") + "\\src\\main\\resources\\patternplate\\专项保护方案\\绿化类\\专项保护方案-绿化类（绿化工程-单圆、双圆、矩形、地上下、高架）.docx";
                realfile = com.seari.custody.util.FileUtil.copyResourceFileToTemp("patternplate\\专项保护方案\\绿化类\\专项保护方案-绿化类（绿化工程-单圆、双圆、矩形、地上下、高架）.docx");
                listeded = Common.downloadWorde(realfile, params, "绿化");
                break;
                //市政类
            case "5" :
                 initial_size=Common.initialointServices(projectword,fileName);
                if(initial_size==0){
                    technicalAdviceMapper.technicaldelect(TechnicalID);
                    return "上传市政技审模板不一致，请重新上传";
                }
                shizheng = Common.shizheng(projectword,fileName);
                params.put("animals", shizheng);
                 row5 = Rows.of(String.valueOf(num+1), "桩基工程", "坍孔", "钻孔桩增加钢护筒、地墙槽壁加固").textFontSize(14).create();
                 row6 = Rows.of(String.valueOf(num+2), "市政项目", "加载", "通过轻质泡沫混凝土或ESP换填").textFontSize(14).create();
                 row7 = Rows.of(String.valueOf(num+3), "其他", "", "").textFontSize(14).create();
                Mnterval.add(row5);
                Mnterval.add(row6);
                Mnterval.add(row7);
                 borderStyle = new TableStyle.BorderStyle();
                borderStyle.setColor("A6A6A6");
                borderStyle.setSize(16);
                borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
                 tableBuilder = Tables.ofA4MediumWidth();
                for(int i=0;i<Mnterval.size();i++){
                    tableBuilder.addRow((RowRenderData) Mnterval.get(i));
                }
                 tableRenderData=tableBuilder.border(borderStyle).center().create();
                params.put("table1", tableRenderData);
                //编号
                 tag=0;
                //文字内容
                 tagWriting="";
                //是否为车站:地上、地下
                if(station!="0"){
                    tagWriting=tagWriting+(tag+1)+"、车站结构或车站附属设施出现病害或对运营产生影响\n"
                            +"\t我方将制定车站结构或车站附属设施出现病害或对运营产生影响相关应急预案，一旦发生此类情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门要，安排施工队伍对病害进行整治，根据事件原因进行项目的技术调整,如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。\n"
                            +(tag+2)+"、施工导致烟雾、扬尘进入车站对运营产生影响\n"
                            +"\t我方将制定施工导致烟雾、扬尘进入车站对运营产生影响相关应急预案，一旦发生上述情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员进行问题排查，根据事件原因进行项目的技术调整，如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。\n";
                        tag=tag+2;
                }
                //单圆、双圆、矩形
                if(section.contains("1")||section.contains("2")||section.contains("3")){
                    tagWriting=tagWriting+(tag+1)+"、隧道出现严重病害\n"
                            +"\t我方将制定隧道出现严重病害相关应急预案，一旦发生此类情况现场将立即停工。地铁隧道内发生严重漏泥、漏砂、漏水、掉块、开裂等病害时，我方立即将相关信息及工程对应情况报告地铁监护管理部门。根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。\n";
                    tag=tag+1;
                }

                //高架、地面
                if(section.contains("4")||section.contains("5")){
                    tagWriting=tagWriting+(tag+1)+"、项目原因导致高架区段异物侵限\n"
                            +"\t我方将制定高架区段异物侵限相关应急预案，一旦发生此类情况现场将立即停工。发生塔吊、吊车侵限，施工异物掉入高架区间或车站时，现场立即停工，第一时间向地铁监护部门汇报，制定相关方案，如对地铁结构造成影响，根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。\n";
                    tag=tag+1;
                }
                tagWriting=tagWriting+(tag+1)+"、恶劣天气影响\n"
                        +"\t我方将制定因恶劣天气导致车站运营产生影响的相关应急预案，事件发生前做好防范工作，现场准备相关应急物资。如对车站运营造成影响，结合现场情况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员处理问题，并负责后续的修复工作直至满足正常运营要求。\n";

                params.put("yingjiyuan",tagWriting);
//                realPath = System.getProperty("user.dir") + "\\src\\main\\resources\\patternplate\\专项保护方案\\市政类\\市政类专项保护方案模板.docx";
                realfile = com.seari.custody.util.FileUtil.copyResourceFileToTemp("patternplate\\专项保护方案\\市政类\\市政类专项保护方案模板.docx");
                listeded = Common.downloadWorde(realfile, params, "市政");
                break;
            case "6" :
                initial_size=Common.initialoint(projectword,fileName, BusinessConstant.CY_TYPE_DSJ_START, BusinessConstant.CY_TYPE_DSJ_END);
                if(initial_size==0){
                    technicalAdviceMapper.technicaldelect(TechnicalID);
                    return "上传穿越类技审模板不一致，请重新上传";
                }
                 shizheng = common.throughDataStr(projectword,fileName, BusinessConstant.CY_TYPE_DSJ_START, BusinessConstant.CY_TYPE_DSJ_END, "2");
                params.put("directory", shizheng);
                 row7 = Rows.of(String.valueOf(num+1), "其他", "", "").textFontSize(14).create();
                Mnterval.add(row7);
                 borderStyle = new TableStyle.BorderStyle();
                borderStyle.setColor("A6A6A6");
                borderStyle.setSize(16);
                borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
                 tableBuilder = Tables.ofA4MediumWidth();
                for(int i=0;i<Mnterval.size();i++){
                    tableBuilder.addRow((RowRenderData) Mnterval.get(i));
                }
                 tableRenderData=tableBuilder.border(borderStyle).center().create();

                params.put("table1", tableRenderData);

                //编号
                 tag=0;
                //文字内容
                 tagWriting="";
                //是否为车站:地上、地下
                if(station!="0"){
                    tagWriting=tagWriting+(tag+1)+"、车站结构或车站附属设施出现病害或对运营产生影响\n"
                            +"\t我方将制定车站结构或车站附属设施出现病害或对运营产生影响相关应急预案，一旦发生此类情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门要，安排施工队伍对病害进行整治，根据事件原因进行项目的技术调整,如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。\n"
                            +(tag+2)+"、施工导致烟雾、扬尘进入车站对运营产生影响\n"
                            +"\t我方将制定施工导致烟雾、扬尘进入车站对运营产生影响相关应急预案，一旦发生上述情况现场将立即停工。结合现场工况分析原因，将情况汇报至地铁监护管理部门，立刻安排专员进行问题排查，根据事件原因进行项目的技术调整，如对车站功能性设施（如电梯、泵房等）造成影响，我方将负责后续的修复工作直至满足正常运营要求。\n";
                    tag=tag+2;
                }
                //单圆、双圆、矩形
                if(section.contains("1")||section.contains("2")||section.contains("3")){
                    tagWriting=tagWriting+(tag+1)+"、隧道出现严重病害\n"
                            +"\t我方将制定隧道出现严重病害相关应急预案，一旦发生此类情况现场将立即停工。地铁隧道内发生严重漏泥、漏砂、漏水、掉块、开裂等病害时，我方立即将相关信息及工程对应情况报告地铁监护管理部门。根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。\n";
                    tag=tag+1;
                }

                //高架、地面
                if(section.contains("4")||section.contains("5")){
                    tagWriting=tagWriting+(tag+1)+"、项目原因导致高架区段异物侵限\n"
                            +"\t我方将制定高架区段异物侵限相关应急预案，一旦发生此类情况现场将立即停工。发生塔吊、吊车侵限，施工异物掉入高架区间或车站时，现场立即停工，第一时间向地铁监护部门汇报，制定相关方案，如对地铁结构造成影响，根据地铁监护管理部门提出的意见，组织后续的修复工作；如对地铁正常运营造成影响甚至停运，启动相关运营应急预案。\n";
                    tag=tag+1;
                }
                params.put("yingjiyuan",tagWriting);
//                 realPath = System.getProperty("user.dir") + "\\src\\main\\resources\\patternplate\\专项保护方案\\穿越类\\专项保护方案-穿越类.docx";
                realfile = com.seari.custody.util.FileUtil.copyResourceFileToTemp("patternplate\\专项保护方案\\穿越类\\专项保护方案-穿越类.docx");
                listeded = Common.downloadWorde(realfile, params, "穿越");
                break;
            default:
                return "未知错误，请重新上传文件";
        }
        //删除文件
        FileUtil.del(realfile);
        //生成word文件地址
        String filePath = listeded.get(0);
        //生成word文件名称
        String fileNameed = listeded.get(1);
        File fileed = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(fileed);
        String contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        minIoUtil.putObject("projectword", fileNameed, fileInputStream, contentType);
        List<String> listededed = common.doc2pdf(filePath, "专项保护方案");
        //生成pdf文件地址
        String pdfread = listededed.get(0);
        //生成pdf文件名称
        String pdfname = listededed.get(1);
        File fileed1 = new File(pdfread);
        FileInputStream fileInputStream1 = new FileInputStream(fileed1);
        String contentType1 = "application/pdf";
        minIoUtil.putObject("projectpdf", pdfname, fileInputStream1, contentType1);
        specialProtection.setWordName(fileNameed);
        specialProtection.setPdfName(pdfname);
        specialProtection.setConstructionUnit(specialProtection.getConstructionUnit());
        specialProtection.setProjectName(specialProtection.getProjectName());
        specialProtection.setType("0");
        specialProtection.setUsersUpload("0");
        // 1、如生成专项保护方案无问题即上传文件到档案系统
        String fileId = HttpClientUtil.uploadLocalAddress(filePath, fileNameed, "58");
        specialProtection.setFileSystemFile(fileId);
        specialProtectionMapper.specialOverview(specialProtection);
        fileInputStream.close();
        fileInputStream1.close();
        return "上传技审文件成功";
    }

    @Override
    public List<SpecialWord> SpecialList(SpecialWord spword) {
        List<SpecialWord> list=specialProtectionMapper.SpecialList(spword);

        for(int i=0;i<list.size();i++){
            String a=list.get(i).getWordName();
            String aa = minioword + a;
            String b=list.get(i).getPdfName();
            String bb = miniopdf + b;
            list.get(i).setWordName(aa);
            list.get(i).setPdfName(bb);
        }

        return list;
    }

    @Override
    public Map<String, String> SpecialProtectionPass(Map<String, String> map) throws Exception {
        Map<String, String> map1=new HashMap<>();
        //获取uuid的值
        String uuid=map.get("uuid");
        //获取流程状态
        String status=map.get("flow_status");
        Map<String, Object> stringObjectMap = technicalAdviceMapper.engineeringInformation(map);
        // 获取状态
        String flow_status=stringObjectMap.get("flow_status").toString();
        if(!flow_status.equals("7")){
            map1.put("code","500");
            map1.put("message","待办状态有误");
            return map1;
        }
        // 修改专项保护方案状态
        Map<String, String> map2=new HashMap<>();
        map2.put("flow_status",status);
        map2.put("uuid",uuid);
        Integer integer = technicalAuditOpinionMapper.updateSendTechnical(map2);
        Map<String, Object> stringIntegerMap = reportProjectMapper.saverFileNumber(uuid);
        Integer flow_number = Integer.valueOf(stringIntegerMap.get("flow_number").toString());
        //通过日志
        if(status.equals("9")){
            TechnicalHistory technicalHistory = new TechnicalHistory();
            technicalHistory.setCreateTime(new Date());
            technicalHistory.setOperationalType("1");
            technicalHistory.setOperationalFlow("9");
            technicalHistory.setOperationalContext("专项保护方案完结");
            technicalHistory.setOperationalState("1");
            technicalHistory.setOperationalProject(uuid);
            technicalHistory.setOperationalNumber(flow_number);
            technicalAdviceMapper.serverTechnicalHistory(technicalHistory);
            //退回日志
        }else if(status.equals("8")){
            TechnicalHistory technicalHistory = new TechnicalHistory();
            technicalHistory.setCreateTime(new Date());
            technicalHistory.setOperationalType("1");
            technicalHistory.setOperationalFlow("8");
            technicalHistory.setOperationalContext("专项保护方案已退回");
            technicalHistory.setOperationalState("1");
            technicalHistory.setOperationalProject(uuid);
            technicalHistory.setOperationalNumber(flow_number);
            technicalAdviceMapper.serverTechnicalHistory(technicalHistory);
        }


        if (integer==1){
            map1.put("code","200");
            map1.put("message","提交成功");
            return map1;
        }else{
            map1.put("code","500");
            map1.put("message","状态修改失败");
            return map1;
        }
//        return null;
    }

    @Override
    public Map<String, Object> specialProtectionPlanId(Map<String, String> map) throws Exception {
        Map<String, Object> map1=new HashMap<>();
        String token=map.get("token");
        String uuid=map.get("uuid");
        if (StringUtils.isNotEmpty(token) == false) {
            map1.put("code","500");
            map1.put("message","token为空生成失败");
            return map1;
        }
        // 根据uuid得到工程休息概括的流程状态
        Map<String, Object> stringObjectMap = technicalAdviceMapper.engineeringInformation(map);
        // 流程状态
        String flow_status= (String) stringObjectMap.get("flow_status");
        // 申报类型
        Object type= stringObjectMap.get("type");
        // 待办不为处理中直接反馈
        if(!"7".equals(flow_status)){
            map1.put("code","500");
            map1.put("message","待办状态有误");
            map1.put("data","0");
            return map1;
        }
        // 专项保护方案
        Map<String, String> map2=new HashMap<>();
        map2.put("uuid",uuid);
        map2.put("type","1");
        Map<String, String> map3 = technicalAuditOpinionMapper.specialProtectionPlan(map2);
        if(map3==null||map3.isEmpty()){
            map1.put("code","500");
            map1.put("message","待办状态有误");
            map1.put("data","0");
            return map1;
        }
        String fileSystemFile=map3.get("fileSystemFile");
        String wordname=map3.get("word_name");
        Map<String, Object> map4=new HashMap<>();
        map4.put("fileSystemFile",fileSystemFile);
        map4.put("wordname",wordname);
        map4.put("type",  type);
        map1.put("code","200");
        map1.put("message","");
        map1.put("data",map4);
        return map1;
    }

    @Override
    public void uploadingSpecialProtection(MultipartFile file, String uuid) throws Exception {
        Common common=new Common();
        String no = UUIDUtils.getUUID();
        Boolean verdict=true;
        // 文件名
        String fileName = file.getOriginalFilename();
        // 去掉后缀文件名
        int pos = fileName.lastIndexOf('.');
        String prefixfilename=fileName.substring(0, pos);
        // MultipartFile转inputstream
        byte [] byteArr=file.getBytes();
        InputStream inputStream = new ByteArrayInputStream(byteArr);
        // 下载文件到本地
        Common.approvalFile(file);
        String mimi = fileAddress + fileName;
        List<String> listeded = common.doc2pdf(mimi, prefixfilename );
        //生成pdf文件地址
        String pdfread = listeded.get(0);
        //生成pdf文件名称
        String pdfname = listeded.get(1);

        // 上传Word到minio
        String contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        minIoUtil.putObject("projectword", fileName, inputStream, contentType);

        // 上传PDF到minio
        FileInputStream fileInputStream1 = new FileInputStream(new File(pdfread));
        String contentType1 = "application/pdf";
        minIoUtil.putObject("projectpdf", pdfname, fileInputStream1, contentType1);

        SpecialProtection specialProtection = new SpecialProtection();
        specialProtection.setNo(no);
        specialProtection.setFileUuid(uuid);
        specialProtection.setWordName(fileName);
        specialProtection.setPdfName(pdfname);
        specialProtection.setCreateTime(new Date());
        specialProtection.setType("0");
        specialProtection.setUsersUpload("1");
        // 1、如生成专项保护方案无问题即上传文件到档案系统
//        String fileId = HttpClientUtil.uploadLocalAddress(filePath, fileNameed, "58");
//        specialProtection.setFileSystemFile(fileId);
        specialProtectionMapper.specialOverview(specialProtection);

    }


}
